﻿using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DataTypes;

namespace Persistencia
{
    public class PersistenciaGastos
    {
        public void AltaGasto(DataGasto dataGasto)
        {
            AccesoBD accesoBD = new AccesoBD();
            //Creo un objeto Command.
            SqlConnection myConnection = accesoBD.ConectarBD(); 

            // accedo al DataGasto
            string nombre = dataGasto.Nombre;
            string descripcion = dataGasto.Descripcion;
            float monto = dataGasto.Monto;

            string consulta = "INSERT INTO Gastos (nombre, descripcion, monto) VALUES ('" + nombre + "','" + descripcion + "'," + monto + ");";
            SqlCommand myCommand = new SqlCommand(consulta, myConnection);
            //Ejecucion del comando en el servidor de BD
            myCommand.ExecuteNonQuery();
            accesoBD.DesconectarBD(myConnection);
        }

        public void ModificarMontoGasto(string nombre, float monto)
        {
            AccesoBD accesoBD = new AccesoBD();
            //Creo un objeto Command.
            SqlConnection myConnection = accesoBD.ConectarBD();

            string consulta = "UPDATE Gastos SET monto = " + monto + " WHERE nombre = '" + nombre + "';";
            SqlCommand myCommand = new SqlCommand(consulta, myConnection);
            //Ejecucion del comando en el servidor de BD
            myCommand.ExecuteNonQuery();
            accesoBD.DesconectarBD(myConnection);  
        }

        public void ModificarGasto(DataGasto dataGastoNuevo, string nombre)
        {
            // accedo al DataGasto
            string nombreNuevo = dataGastoNuevo.Nombre;
            string descripcion = dataGastoNuevo.Descripcion;
            float monto = dataGastoNuevo.Monto;
            int idGasto = ObtenerIdGasto(nombre);
            AccesoBD accesoBD = new AccesoBD();
            //Creo un objeto Command.
            SqlConnection myConnection = accesoBD.ConectarBD();
            string consulta = "UPDATE Gastos set monto = " + monto + ", nombre = '" + nombreNuevo + "', descripcion = '" + descripcion + "' where idGasto = " + idGasto + ";";
            SqlCommand myCommand = new SqlCommand(consulta, myConnection);
            //Ejecucion del comando en el servidor de BD
            myCommand.ExecuteNonQuery();
            accesoBD.DesconectarBD(myConnection);  
        }

        public bool ExisteDataGasto(string nombre)
        {
            bool existeGasto = false;
            AccesoBD accesoBD = new AccesoBD();
            //Creo un objeto Command.
            SqlConnection myConnection = accesoBD.ConectarBD();
            string consulta = "select * from Gastos where nombre = '" + nombre + "';";
            SqlCommand myCommand = new SqlCommand(consulta, myConnection);
            SqlDataReader objReader = myCommand.ExecuteReader();

            while (objReader.Read() && !existeGasto)
            {
                existeGasto = objReader != null;
            }
            objReader.Close();
            accesoBD.DesconectarBD(myConnection);
            return existeGasto;
        }

        public void EliminarGasto(string nombre)
        {
            AccesoBD accesoBD = new AccesoBD();
            //Creo un objeto Command.
            SqlConnection myConnection = accesoBD.ConectarBD();

            string consulta = "delete from Gastos where nombre = '" + nombre + "';";
            SqlCommand myCommand = new SqlCommand(consulta, myConnection);
            //Ejecucion del comando en el servidor de BD
            myCommand.ExecuteNonQuery();
            accesoBD.DesconectarBD(myConnection);
        }

        public List<DataGasto> ListarGastos()
        {
            List<DataGasto> listagastos = new List<DataGasto>();
            string consulta = "select nombre, descripcion, monto from Gastos;";
            string nombre = "";
            string descripcion = "";
            float monto = 0;

            AccesoBD accesoBD = new AccesoBD();
            //Creo un objeto Command.
            SqlConnection myConnection = accesoBD.ConectarBD();
            SqlCommand myCommand = new SqlCommand(consulta, myConnection);
            SqlDataReader objReader = myCommand.ExecuteReader();

            while (objReader.Read())
            {
                nombre = Convert.ToString(objReader["nombre"]);
                descripcion = Convert.ToString(objReader["descripcion"]);
                monto = (float)Convert.ToDecimal(objReader["monto"]);
                DataGasto gasto = new DataGasto(nombre, descripcion);
                gasto.Monto = monto;
                listagastos.Add(gasto);
            }
            return listagastos;
        }

        // -- M E T O D O S   A U X I L I A R E S  -- ////////////////////////////////////////////////////////////////////////
        private int ObtenerIdGasto(string nombre)
        {
            int idGasto = 0;
            AccesoBD accesoBD = new AccesoBD();
            //Creo un objeto Command.
            SqlConnection myConnection = accesoBD.ConectarBD();

            string consulta = "select idGasto from Gastos where nombre = '" + nombre + "';";
            SqlCommand myCommand = new SqlCommand(consulta, myConnection);
            SqlDataReader objReader = myCommand.ExecuteReader();
            while (objReader.Read())
            {
                idGasto = Convert.ToInt32(objReader["idGasto"]);
            }
            objReader.Close();
            accesoBD.DesconectarBD(myConnection);
            return idGasto;
        }
    }
}
